#ifndef _PROTOCOL_BOARD_H_
#define _PROTOCOL_BOARD_H_

#include <config.h>
#include <stdbool.h>
#include "device_parameter.h"

// 固定加解密密钥
// 杨格
#define FIXED_ENCRYED_DECRYED_KEY_YGS                    "M7Qn3crq5RWu@42H"
// 尚美数智
#define FIXED_ENCRYED_DECRYED_KEY_SMSZ                   "SMSZ_vvE9NFhaT6G"
// 德胧
#define FIXED_ENCRYED_DECRYED_KEY_DL                     "DELON@TejF8fJ5Yv"

/**
 * @brief 事件处理中心事件类型
 *
 */
typedef enum
{
  MESSAGE_CENTER_SENDING = 1 << 0, // 报文发送
} ProtocolCenterEvent_t;

/**
 * @brief 网络附着状态
 *
 */
typedef enum
{
  NETWORK_NOT_ACTIVATED      = 0x00, // 网络未启用
  NETWORK_ATTACHMENT_ACCESS  = 0x10, // 入网中
  NETWORK_ATTACHMENT_ERROR   = 0x11, // 网络附着失败
  NETWORK_ATTACHMENT_SUCCESS = 0x12, // 网络附着成功
} ProtocolNetAttaResult_t;

// 消息发送任务
typedef void (*ProtocolSendingTask_t)(void);
// 报文解析任务
typedef void (*ProtocolParsingTask_t)(const void *);

/**
 * @brief 接收报文字段内容
 *
 */
typedef struct
{
  uint8_t DataSource;                          // 数据来源
  uint16_t SizeOfData;                         // 附带数据长度
  uint8_t AttachedData[NOMINAL_PACKET_LENGTH]; // 附带数据
} ProtocolRxMessageFormat_t;

/**
 * @brief 事件处理中心外部调用方法
 *
 */
typedef struct
{
  ProtocolParsingTask_t ProtocolParsingTask; // 报文解析任务
  ProtocolSendingTask_t ProtocolSendingTask; // 报文发送任务
} ProtocolCenterExternalInterfaces_t;

/**
 * @brief 获取外部验证使能位
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool ProtocolGetExternalValidationFunctionEnableBit(void);

/**
 * @brief 获取最大缓存文件大小
 *
 * @return uint32_t - 最大缓存文件大小（字节）
 */
extern uint32_t ProtocolGetMaxCacheFileSize(void);

/**
 * @brief 获取实时时间
 *
 * @return uint32_t - 实时时间（时间戳）
 */
extern uint32_t ProtocolGetCurrentTimestamp(void);

/**
 * @brief 设置实时时间
 *
 * @param Timestamp - 实时时间（时间戳）
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetCurrentTimestamp(uint32_t Timestamp);

/**
 * @brief 获取消息队列繁忙标志
 *
 * @return bool - 繁忙标识（true：繁忙 false：空闲）
 */
extern bool ProtocolGetMessageQueueBusyEn(void);

/**
 * @brief 设置消息队列繁忙标识
 *
 * @param En - 繁忙标识（true：繁忙 false：空闲）
 */
extern void ProtocolSetMessageQueueBusyEn(bool En);

/**
 * @brief 获取网络附着状态
 *
 * @return ProtocolNetAttaResult_t - 网络附着状态
 */
extern ProtocolNetAttaResult_t ProtocolGetNetworkAttachmentStatus(void);

/**
 * @brief 获取本地注册步骤
 *
 * @return uint8_t - 本地注册步骤
 */
extern uint8_t ProtocolGetLocalRegisterStep(void);

/**
 * @brief 获取本地注册结果
 *
 * @return uint8_t - 本地注册结果
 */
extern uint8_t ProtocolGetLocalRegisterResult(void);

/**
 * @brief 进入在线注册模式
 *
 * @param FileType                     - 文件类型
 * @param FileSize                     - 文件大小
 * @param pRegisterUsersThroughFilesIn - 注册文件信息
 * @return bool                        - 记录状态（true：成功 false：失败）
 */
extern bool ProtocolIntoOnlineRegisterMode(uint8_t FileType, uint32_t FileSize, const void *pRegisterUsersThroughFilesIn);

/**
 * @brief 校验文件有效性
 *
 * @param FileSize - 文件总长度
 * @return uint8_t - 校验码
 */
extern uint8_t ProtocolCheckFileValidity(uint32_t FileSize);

/**
 * @brief 标志文件校验失败
 *
 */
extern void ProtocolMarkFileCheckCodeFailure(void);

/**
 *
 * @brief 获取读卡芯片故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t ProtocolGetRfidFailureIdent(void);

/**
 * @brief 获取键盘故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t ProtocolGetKeyboardFailureIdent(void);

/**
 * @brief 获取人脸模组故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t ProtocolGetFaceFailureIdent(void);

/**
 * @brief 获取指纹故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t ProtocolGetFingerFailureIdent(void);

/**
 * @brief 获取指纹模组通讯故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t ProtocolGetFingerFailureIdent(void);

/**
 * @brief 获取无线模组通讯故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t ProtocolGetWirelessFailureIdent(void);

/**
 * @brief 获取设备自检结果
 *
 * @return uint8_t - 设备自检结果
 */
extern uint8_t ProtocolGetSelfTestResult(void);

/**
 * @brief 获取电池电压百分比
 *
 * @return uint8_t - 电压百分比
 */
extern uint8_t ProtocolGetVoltagePercentage(void);

/**
 * @brief 获取设备唯一编码
 *
 * @param pMacAddrOut - 唯一编码
 */
extern void ProtocolGetDeviceMacAddr(uint8_t *pMacAddrOut);

/**
 * @brief 获取485使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool ProtocolGetRs485FunctionEnableBit(void);

/**
 * @brief 获取网络使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool ProtocolNetworkFunctionEnableBit(void);

/**
 * @brief 获取人脸模组使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool ProtocolGetFaceFunctionEnableBit(void);

/**
 * @brief 获取可用持卡人目录
 *
 * @param pUserNameIn - 用户名
 * @return bool       - 结果（true：成功 false：失败）
 */
extern bool ProtocolGetDirectoryOfAvailableCardholders(const uint8_t *pUserNameIn);

/**
 * @brief 确定该类型的密钥是否支持本地注册
 *
 * @param KeyType - 密钥类型
 * @return bool   - 结果（true：有效 false：无效）
 */
extern bool ProtocolDetermineIfThisTypeOfKeySupportsLocalRegister(uint8_t KeyType);

/**
 * @brief 获取设备功能
 *
 * @return uint8_t - 设备功能
 */
extern uint8_t ProtocolGetDeviceFunction(void);

/**
 * @brief 设置设备功能
 *
 * @param Function - 设备功能
 * @return bool    - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetDeviceFunction(uint8_t Function);

/**
 * @brief 获取设备激活状态
 *
 * @return bool - 激活状态（true：激活 false: 未激活）
 */
extern bool ProtocolGetDeviceActivationStatus(void);

/**
 * @brief 获取引导程序更新文件属性
 *
 * @param pCrcValue - 文件crc校验值
 * @param pFileSize - 文件大小
 * @return bool     - 获取状态（true：成功 false：失败）
 */
extern bool ProtocolGetBootloaderUpdateInfo(uint32_t *pCrcValue, uint32_t *pFileSize);

/**
 * @brief 标志进入正常工作模式
 *
 */
extern void ProtocolIntoNormalMode(void);

/**
 * @brief 进入引导程序固件更新模式
 *
 * @param CrcValue - 文件crc校验值
 * @param FileSize - 文件大小
 */
extern void ProtocolIntoBootloaderFirmwareUpdateMode(uint32_t CrcValue, uint32_t FileSize);

/**
 * @brief 退出引导程序固件更新模式
 *
 * @param UpdateStatus - 更新状态
 */
extern void ProtocolExitBootloaderFirmwareUpdateMode(bool UpdateStatus);

// /**
//  * @brief 标志进入应用程序固件更新模式
//  *
//  */
// extern void ProtocolIntoFirmwareUpdateMode(void);

/**
 * @brief 标志进入应用程序固件更新模式
 *
 */
extern void ProtocolIntoApplicationFirmwareUpdateMode(void);

/**
 * @brief 获取常开使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool ProtocolGetNormalOpenEn(void);

/**
 * @brief 获取设备类型
 *
 * @return uint8_t - 设备类型
 */
extern uint8_t ProtocolGetDeviceType(void);

/**
 * @brief 设置设备类型
 *
 * @param DeviceType - 设备类型
 * @return bool      - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetDeviceType(uint8_t DeviceType);

/**
 * @brief 获取产品出厂日期
 *
 * @return uint32_t - 出厂日期
 */
extern uint32_t ProtocolGetDateOfProduction(void);

/**
 * @brief 设置产品出厂日期
 *
 * @param Date  - 出厂日期
 * @return bool - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetDateOfProduction(uint32_t Date);

/**
 * @brief 获取电路板版本号
 *
 * @param pBoardVersionOut - 电路板版本号
 */
extern void ProtocolGetBoardVersionNumber(void *pBoardVersionOut);

/**
 * @brief 设置电路板版本号
 *
 * @param pBoardVersionOut - 电路板版本号
 * @return bool            - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetBoardVersionNumber(const void *pBoardVersionIn);

/**
 * @brief 获取固件版本号
 *
 * @param pFirmwareVersionOut - 固件版本号
 */
extern void ProtocolGetFirmwareVersionNumber(void *pFirmwareVersionOut);

/**
 * @brief 获取质检员编码
 *
 * @param pQualityControlCodeOut - 质检员编码
 */
extern void ProtocolGetQualityControlCode(void *pQualityControlCodeOut);

/**
 * @brief 设置质检员编码
 *
 * @param pQualityControlCodeIn - 质检员编码
 * @return bool                 - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetQualityControlCode(const void *pQualityControlCodeIn);

/**
 * @brief 获取芯片型号
 *
 * @param pChipModeOut - 芯片型号
 */
extern void ProtocolGetChipModelNumber(void *pChipModeOut);

/**
 * @brief 获取持卡人上限
 *
 * @return uint8_t - 持卡人数量
 */
extern uint8_t ProtocolGetNumberOfCardholder(void);

/**
 * @brief 设置持卡人上限
 *
 * @param NumberOfCardholder - 持卡人数量
 * @return bool              - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetNumberOfCardholder(uint8_t NumberOfCardholder);

/**
 * @brief 获取播报功能控制位
 *
 * @return bool - 开启状态（true：开启 false：关闭）
 */
extern bool ProtocolGetDayBroadcastContorlEn(void);

/**
 * @brief 设置播报功能控制位
 *
 * @param ContorlEn - 开启状态（true：开启 false：关闭）
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetDayBroadcastContorlEn(uint8_t ContorlEn);

/**
 * @brief 获取开始播报天数
 *
 * @return uint8_t - 播报天数
 */
extern uint8_t ProtocolGetBroadcastRemainingDays(void);

/**
 * @brief 设置开始播报天数
 *
 * @param Days  - 播报天数
 * @return bool - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetBroadcastRemainingDays(uint8_t RemainingDays);

/**
 * @brief 获取系统音量
 *
 * @return uint8_t - 系统音量
 */
extern uint8_t ProtocolGetSystemVolume(void);

/**
 * @brief 设置系统音量
 *
 * @param Volume - 系统音量
 * @return bool  - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetSystemVolume(uint8_t Volume);

/**
 * @brief 获取开锁时间
 *
 * @return uint8_t - 开锁时间
 */
extern uint8_t ProtocolGetUnlockingTime(void);

/**
 * @brief 设置开锁时间
 *
 * @param UnlockingTime - 开锁时间
 * @return bool         - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetUnlockingTime(uint8_t UnlockingTime);

/**
 * @brief 获取电机驱动时间
 *
 * @return uint8_t - 电机驱动时间
 */
extern uint8_t ProtocolGetMotorDriveTime(void);

/**
 * @brief 设置电机驱动时间
 *
 * @param DriveTime - 电机驱动时间
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetMotorDriveTime(uint8_t DriveTime);

/**
 * @brief 获取心跳间隔时间
 *
 * @return uint16_t - 心跳间隔
 */
extern uint16_t ProtocolGetHeartbeatInterval(void);

/**
 * @brief 设置心跳间隔
 *
 * @param Heartbeat - 心跳间隔时间
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetHeartbeatInterval(uint16_t Heartbeat);

/**
 * @brief 获取摄像头检索时间
 *
 * @return uint8_t - 检索超时时间
 */
extern uint8_t ProtocolGetCameraRecognitionTimeout(void);

/**
 * @brief 设置摄像头检索超时时间
 *
 * @param SearchTimeout - 检索超时时间
 * @return bool         - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetCameraRecognitionTimeout(uint8_t SearchTimeout);

/**
 * @brief 获取鉴权允许误差时间
 *
 * @return uint8_t - 误差时间
 */
extern uint8_t ProtocolGetAllowableTimeError(void);

/**
 * @brief 设置鉴权误差时间
 *
 * @param ErrorTime - 误差时间
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetAllowableTimeError(uint8_t ErrorTime);

/**
 * @brief 获取键盘灵敏度
 *
 * @return uint8_t - 键盘灵敏度
 */
extern uint8_t ProtocolGetKeyboardSensitivity(void);

/**
 * @brief 设置键盘灵敏度
 *
 * @param Sensitivity - 键盘灵敏度
 * @return bool       - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetKeyboardSensitivity(uint8_t Sensitivity);

/**
 * @brief 获取离线卡使能配置
 *
 * @return uint8_t - 使能配置
 */
extern uint8_t ProtocolGetOfflineCardFunctionEnable(void);

/**
 * @brief 设置离线卡使能配置
 *
 * @param EnableBit - 使能配置
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetOfflineCardFunctionEnable(uint8_t EnableBit);

/**
 * @brief 获取网络运营商
 *
 * @return uint8_t - 网络运营商
 */
extern uint8_t ProtocolGetAcquireNetworkOperators(void);

/**
 * @brief 设置网络运营商
 *
 * @param NetworkOperator - 网络运营商
 * @return bool           - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetAcquireNetworkOperators(uint8_t NetworkOperator);

/**
 * @brief 获取蓝牙连接超时时间
 *
 * @return uint8_t - 蓝牙超时时间
 */
extern uint8_t ProtocolGetBluetoothConnectionTimeout(void);

/**
 * @brief 设置蓝牙超时时间
 *
 * @param Timeout - 蓝牙超时时间
 * @return bool   - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetBluetoothConnectionTimeout(uint8_t Timeout);

/**
 * @brief 获取假锁警报间隔检测时间
 *
 * @return uint8_t - 间隔检测时间
 */
extern uint8_t ProtocolGetFalseLockDetcetionInterval(void);

/**
 * @brief 设置假锁警报间隔检测时间
 *
 * @param Interval - 间隔检测时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetFalseLockDetcetionInterval(uint8_t Interval);

/**
 * @brief 获取撬锁警报间隔检测时间
 *
 * @return uint8_t - 间隔检测时间
 */
extern uint8_t ProtocolGetTheBreakInDetcetionInterval(void);

/**
 * @brief 设置撬锁警报间隔检测时间
 *
 * @param Interval - 间隔检测时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetBreakInDetcetionInterval(uint8_t Interval);

/**
 * @brief 获取常开事件间隔提示时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t ProtocolGetNormalOpenReminderInterval(void);

/**
 * @brief 设置常开提示间隔提示时间
 *
 * @param Interval - 间隔提示时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetNormalOpenReminderInterval(uint8_t Interval);

/**
 * @brief 获取错误提示功能配置
 *
 * @return uint8_t - 配置
 */
extern uint8_t ProtocolGetErrorPromptFunctionConfiguration(void);

/**
 * @brief 设置错误提示功能配置
 *
 * @param Configuration - 配置
 * @return bool         - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetErrorPromptFunctionConfiguration(uint8_t Configuration);

/**
 * @brief 获取蓝牙更新广播间隔时间
 *
 * @return uint8_t - 间隔时间
 */
extern uint8_t ProtocolGetBluetoothUpdateRaidioInterval(void);

/**
 * @brief 设置蓝牙更新广播间隔时间
 *
 * @param Interval - 间隔时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetBluetoothUpdateRaidioInterval(uint8_t Interval);

/**
 * @brief 获取反锁提示间隔时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t ProtocolGetLockedInReminderInterval(void);

/**
 * @brief 设置反锁提示间隔时间
 *
 * @param Interval - 间隔提示时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetLockedInReminderInterval(uint8_t Interval);

/**
 * @brief 获取卡片读取灵敏度
 *
 * @return uint8_t - 卡片读取灵敏度
 */
extern uint8_t ProtocolGetCardReadingSensitivity(void);

/**
 * @brief 设置卡片读取灵敏度
 *
 * @param Sensitivity - 卡片读取灵敏度
 * @return bool       - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetCardReadingSensitivity(uint8_t Sensitivity);

/**
 * @brief 获取卡片识读类型
 *
 * @return uint8_t - 卡片识读类型
 */
extern uint8_t ProtocolGetReadTheCardType(void);

/**
 * @brief 设置主板数量
 * 
 * @param Number 
 * @return true 
 * @return false 
 */
bool ProtocolSetDeviceBoardNum(uint8_t Number);

/**
 * @brief 设置卡片识读类型
 *
 * @param CardType - 卡片识读类型
 * @return bool    - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetReadTheCardType(uint8_t CardType);

/**
 * @brief 获取第三方类型
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetThirdPartyTypeOfReading(void);

/**
 * @brief 设置第三方类型
 * 
 * @param ThirdPartyTypeOfReading 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetThirdPartyTypeOfReading(uint8_t ThirdPartyTypeOfReading);


/**
 * @brief 获取卡片访问密钥
 *
 * @param pKeyOut  - 扇区访问密钥
 */
extern void ProtocolGetCardOperationSectorKey(uint8_t *pKeyOut);

/**
 * @brief 设置设置访问密钥
 *
 * @param pKeyIn - 扇区访问密钥
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetCardOperationSectorKey(const uint8_t *pKeyIn);

/**
 * @brief 获取卡片操作扇区
 *
 * @return uint8_t - 操作扇区
 */
extern uint8_t ProtocolGetCardOperationSector(void);

/**
 * @brief 设置卡片操作扇区
 *
 * @param StartSector - 操作扇区
 * @return bool       - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetCardOperationSector(uint8_t StartSector);

/**
 * @brief 获取客户编码
 *
 * @return uint32_t - 客户编码
 */
extern uint32_t ProtocolGetCustomerCode(void);

/**
 * @brief 设置客户编码
 *
 * @param CustomerCode - 客户编码
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetCustomerCode(uint32_t CustomerCode);

/**
 * @brief 获取授权结束时间
 *
 * @return uint32_t - 授权结束时间
 */
extern uint32_t ProtocolGetAuthorizationEndTime(void);

/**
 * @brief 设置授权结束时间
 *
 * @param EndTime - 授权结束时间
 * @return bool   - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetAuthorizationEndTime(uint32_t EndTime);

/**
 * @brief 获取加解密密钥
 *
 * @param pEncryptionKeyOut - 密钥
 */
extern void ProtocolGetEncryptionKey(void *pEncryptionKeyOut);

/**
 * @brief 设置加解密密钥
 *
 * @param pEncryptionKeyIn - 密钥
 * @return bool            - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetEncryptionKey(const void *pEncryptionKeyIn);

/**
 * @brief 获取超级管理员密码
 *
 * @param pPasswordOut - 密码
 */
extern void ProtocolGetSuperAdministratorPassword(void *pPasswordOut);

/**
 * @brief 设置超级管理员密码
 *
 * @param pPasswordIn - 密码
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetSuperAdministratorPassword(const void *pPasswordIn);

/**
 * @brief 获取时区
 *
 * @return uint8_t - 时区
 */
extern uint8_t ProtocolGetTimeZone(void);

/**
 * @brief 设置时区
 *
 * @param TimeZone - 时区
 * @return bool    - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetTimeZone(uint8_t TimeZone);

/**
 * @brief 获取房间类型
 *
 * @return uint16_t - 房间类型
 */
extern uint16_t ProtocolGetRoomType(void);

/**
 * @brief 设置房间类型
 *
 * @param RoomType - 房间类型
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool ProtocolSetRoomType(uint16_t RoomType);

/**
 * @brief 获取顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint32_t ProtocolGetGroupingNumber(void);

/**
 * @brief 设置顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool ProtocolSetGroupingNumber(uint32_t GroupingNumber);

/**
 * @brief 获取园区号
 *
 * @return uint8_t - 园区号
 */
extern uint8_t ProtocolGetParkNumber(void);

/**
 * @brief 设置园区号
 *
 * @param ParkId - 园区号
 * @return bool  - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetParkNumber(uint8_t ParkId);

/**
 * @brief 获取楼栋编码
 *
 * @return uint8_t - 楼栋编码
 */
extern uint8_t ProtocolGetBuildingNumber(void);

/**
 * @brief 设置楼栋编码
 *
 * @param BuildingId - 楼栋编码
 * @return bool      - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetBuildingNumber(uint8_t BuildingId);

/**
 * @brief 获取楼层编码
 *
 * @return uint8_t - 楼层编码
 */
extern uint8_t ProtocolGetFloorNumber(void);

/**
 * @brief 设置楼层编码
 *
 * @param FloorId - 楼层编码
 * @return bool   - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetFloorNumber(uint8_t FloorId);

/**
 * @brief 获取房间编码
 *
 * @return uint32_t - 房间编码
 */
extern uint32_t ProtocolGetRoomNumber(void);

/**
 * @brief 设置房间编码
 *
 * @param RoomId - 房间编码
 * @return bool  - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetRoomNumber(uint32_t RoomId);

/**
 * @brief 获取子房间编码
 *
 * @return uint8_t - 子房间编码
 */
extern uint8_t ProtocolGetChildRommNumber(void);

/**
 * @brief 设置子房间编码
 *
 * @param ChildRommNumber - 子房间编码
 * @return bool           - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetChildRommNumber(uint8_t ChildRommNumber);

/**
 * @brief 获取设备活跃时间
 *
 * @return uint32_t - 设备激活时间
 */
extern uint32_t ProtocolGetDeviceActivationTime(void);

/**
 * @brief 获取设备激活时间
 *
 * @param Time - 设备激活时间
 */
extern void ProtocolSetDeviceActivationTime(uint32_t Time);

/**
 * @brief 获取协议格式
 *
 * @return uint8_t - 协议格式
 */
extern uint8_t ProtocolGetProtocolFormat(void);

/**
 * @brief 设置蓝牙主机模式
 * 
 * @param Mode 0x10:关闭, 0x11:开启
 * @return true 
 * @return false 
 */
extern bool ProtocolSetBleMasterModeSwitch(uint8_t Mode);

/**
 * @brief 获取蓝牙主机模式
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetBleMasterModeSwitch(void);

/**
 * @brief 设置协议格式
 *
 * @param ProtocolFormat - 协议格式
 * @return bool          - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetProtocolFormat(uint8_t ProtocolFormat);

/**
 * @brief 获取外层加解密密钥
 *
 * @param pKeyOut - 密钥
 */
extern void ProtocolGetOuterLayerEncryptionKey(uint8_t *pKeyOut);

/**
 * @brief 获取电梯扇区访问密钥
 * 
 * @param pKeyOut 
 */
extern void ProtocolGetElevatorSectorAccessKey(uint8_t *pKeyOut);

/**
 * @brief 获取设备索引掩码
 *
 * @return uint16_t - 设备索引掩码
 */
extern uint16_t ProtocolGetDeviceIndexMask(void);

/**
 * @brief 获取 DNS 服务器地址
 *
 * @param pMaskAddr - DNS 服务器
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool ProtocolGetDnsServerAddress(void *pDnsAddressOut);

/**
 * @brief 设置 DNS 服务器地址
 *
 * @param pIpAddrIn - DNS服务器地址
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetDnsServerAddress(const void *pDnsAddressIn);

/**
 * @brief 获取服务器访问域名
 *
 * @param pDomainAddressOut - 服务器域名
 */
extern void ProtocolObtainTheServerDomainAddress(void *pDomainAddressOut);

/**
 * @brief 设置服务器域名
 *
 * @param pDomainAddressIn - 写入的域名
 * @return bool            - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetTheDomainNameOfTheServer(const void *pDomainAddressIn);

/**
 * @brief 获取服务器访问端口
 *
 * @return uint16_t - 服务器访问端口
 */
extern uint16_t ProtocolGetTheServerConnectionPort(void);

/**
 * @brief 设置服务器访问端口
 *
 * @param ConnectionPort - 服务器端口
 * @return bool          - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetTheServerConnectionPort(uint16_t ConnectionPort);

/**
 * @brief 获取MQTT登录用户名
 *
 * @param pUserNameOut - 用户名
 */
extern void ProtocolGetMqttUserName(void *pUserNameOut);

/**
 * @brief 设置MQTT登录用户名
 *
 * @param pUserNameIn - 用户名
 * @return bool       - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetMqttUserName(const void *pUserNameIn);

/**
 * @brief 获取MQTT登录密码
 *
 * @param pPasswordOut - 登录密码
 */
extern void ProtocolGetMqttAccessPassword(void *pPasswordOut);

/**
 * @brief 设置MQTT登录密码
 *
 * @param pPasswordIn - 登录密码
 * @return bool       - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetMqttAccessPassword(const void *pPasswordIn);

/**
 * @brief 获取MQTT订阅主题
 *
 * @param pTopicOut - 订阅主题
 */
extern void ProtocolGetMqttSubscriptioTopic(void *pTopicOut);

/**
 * @brief 设置MQTT订阅主题
 *
 * @param pTopicIn - 订阅主题
 * @return bool    - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetMqttSubscriptioTopic(const void *pTopicIn);

/**
 * @brief 获取MQTT发布主题
 *
 * @param pTopicOut - 发布主题
 */
extern void ProtocolGetMqttPublishTopic(void *pTopicOut);

/**
 * @brief 设置MQTT发布主题
 *
 * @param pTopicIn - 发布主题
 * @return bool    - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetMqttPublishTopic(const void *pTopicIn);

/**
 * @brief 获取服务器目标IP地址
 *
 * @param pAddressOut - 目标IP地址
 */
extern void ProtocolGetTargetServerConnectionIpAddress(void *pAddressOut);

/**
 * @brief 设置服务器目标IP地址
 *
 * @param pAddressIn - 目标IP地址
 * @return bool      - 设置状态（true：成功 false：失败）
 */
extern bool ProtocolSetTargetServerConnectionIpAddress(const void *pAddressIn);

/**
 * @brief 获取无线模组发射功率
 * 
 * @return uint8_t - 发射功率
 */
extern uint8_t ProtocolGetWirelessModuleEmissionPower(void);

/**
 * @brief 设置无线模组发射功率
 * 
 * @param EmissionPower - 发射功率
 * @return bool         - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetWirelessModuleEmissionPower(uint8_t EmissionPower);

/**
 * @brief 获取无线模组入网超时时间
 * 
 * @return uint8_t - 入网超时时间
 */
extern uint8_t ProtocolGetWirelessModuleNetworkTimeout(void);

/**
 * @brief 设置无线模组入网超时时间
 * 
 * @param NetworkTimeout - 入网超时时间
 * @return bool          - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetWirelessModuleNetworkTimeout(uint8_t NetworkTimeout);

/**
 * @brief 获取无线模组频率范围
 * 
 * @return uint8_t - 无线模组频率范围
 */
extern uint8_t ProtocolGetWirelessModuleFrequencyRange(void);

/**
 * @brief 设置无线模组频率范围
 *
 * @param FrequencyRange - 无线模组频率范围
 * @return bool          - 设置状态(true-成功  false-失败)
 */
extern bool ProtocolSetWirelessModuleFrequencyRange(uint8_t FrequencyRange);

/**
 * @brief 从内存中加载设备参数
 *
 */
extern void ProtocolLoadDeviceParametersFromMemory(void);

/**
 * @brief 更新设备参数
 *
 */
extern void ProtocolUpdateDeviceParamete(void);

/**
 * @brief 执行命令开锁
 *
 * @param pUserIdIn - 用户编码
 * @param Mode      - 开锁方式
 * @return bool     - 执行状态（true：成功 false：失败）
 */
extern bool ProtocolExecuteCommandToUnlock(const uint8_t *pUserIdIn, uint8_t Mode);

/**
 * @brief 执行二维码开锁
 *
 * @param pUserIdIn - 用户编码
 */
extern void ProtocolExecuteQrCodeToUnLock(const uint8_t *pUserIdIn);

/**
 * @brief 外部主机请求开锁
 *
 * @param KeyType     - 密钥类型
 * @param pKeyValueIn - 密钥
 */
extern void ProtocolExternalHostRequestToUnlock(uint8_t KeyType, const uint8_t *pKeyValueIn);

/**
 * @brief 提示设备已激活
 *
 */
extern void ProtocolPromptForDeviceActivation(void);

/**
 * @brief 播放连接测试音频
 *
 */
extern void ProtocolPlayConnectTestAudio(void);

/**
 * @brief 通过蓝牙主机发送一定长度的数据
 *
 * @param pDataIn - 待发送的数据
 * @param SizeIn  - 待发送数据长度
 */
extern void ProtocolSendDataToBluetoothHost(const void *pDataIn, uint16_t SizeIn);

/**
 * @brief 通过网络发送一定长度的数据
 *
 * @param pDataIn - 待发送的数据
 * @param SizeIn  - 待发送数据长度
 */
extern void ProtocolSendDataToNetwok(const uint8_t *pDataIn, uint16_t SizeIn);

/**
 * @brief 获取注册密钥数量
 *
 * @param pUserNameIn - 用户名
 * @return uint16_t   - 密钥数量
 */
extern uint16_t ProtocolGetNumberOfRegisterKeys(const uint8_t *pUserNameIn);

/**
 * @brief 读写特定卡类型的顶替时间
 *
 * @param CardType         - 卡类型
 * @param pCardReplaceTime - 顶替时间
 * @param pCardReplaceId   - 顶替编码
 * @param Active           - 动作类型（true：设置 false：读取）
 * @return bool            - 操作状态（true：成功 false：失败）
 */
extern bool ProtocolRWCardReplaceTime(uint8_t CardType, uint32_t *pCardReplaceTime, uint16_t *pCardReplaceId, bool Active);

/**
 * @brief 获取免打扰起始时间 - 时
 *
 * @return uint8_t - 免打扰起始时间 - 时
 */
extern uint8_t ProtocolGetNoDisturbingStartHour(void);

/**
 * @brief 设置免打扰起始时间 - 时
 *
 * @param StartHour - 免打扰起始时间 - 时
 * @return bool     - 设置状态（true：成功  false：失败）
 */
extern bool ProtocolSetNoDisturbingStartHour(uint8_t StartHour);

/**
 * @brief 获取免打扰起始时间 - 分
 *
 * @return uint8_t - 免打扰起始时间 - 分
 */
extern uint8_t ProtocolGetNoDisturbingStartMinute(void);

/**
 * @brief 设备免打扰起始时间 - 分
 *
 * @param StartMinute - 免打扰起始时间 - 分
 * @return bool       - 设置状态（true：成功  false：失败）
 */
extern bool ProtocolSetNoDisturbingStartMinute(uint8_t StartMinute);

/**
 * @brief 获取免打扰结束时间 - 时
 *
 * @return uint8_t - 免打扰结束时间 - 时
 */
extern uint8_t ProtocolGetNoDisturbingEndHour(void);

/**
 * @brief 设置免打扰结束时间 - 时
 *
 * @param EndHour - 免打扰结束时间 - 时
 * @return bool   - 设置状态（true：成功  false：失败）
 */
extern bool ProtocolSetNoDisturbingEndtHour(uint8_t EndHour);

/**
 * @brief 获取免打扰结束时间 - 分
 *
 * @return uint8_t - 免打扰结束时间 - 时
 */
extern uint8_t ProtocolGetNoDisturbingEndMinute(void);

/**
 * @brief 设置免打扰结束时间 - 分
 *
 * @param EndHour - 免打扰结束时间 - 分
 * @return bool   - 设置状态（true：成功  false：失败）
 */
extern bool ProtocolSetNoDisturbingEndMinute(uint8_t EndMinute);

/**
 * @brief 重置心跳累加时间
 *
 */
extern void ProtocolResetAccumulatedTimeOfHeartbeats(void);

/**
 * @brief 获取用户密钥信息
 *
 * @param UserId                    - 用户编码
 * @param pUserNameIn               - 用户名
 * @param StartNumber               - 起始序号
 * @param EndNumber                 - 接收序号
 * @param pCardHolderInformationOut - 持卡人信息
 * @param pInformationSizeOut       - 持卡人信息长度
 * @param uint8_t                   - 获取结果
 */
extern uint8_t ProtocolGetUserKeyInformation(const uint8_t UserId, const void *pUserNameIn, const uint8_t StartNumber, const uint8_t EndNumber, uint8_t *pCardHolderInformationOutOut, uint16_t *pInformationSizeOut);

/**
 * @brief 新增持卡人
 *
 * @param pInformationIn - 持卡人信息
 * @return uint8_t       - 新增结果
 */
extern uint8_t ProtocolNewCardholder(const void *pInformationIn);

/**
 * @brief 删除持卡人
 *
 * @param pInformationIn - 持卡人信息
 * @return uint8_t       - 删除结果
 */
extern uint8_t ProtocolDeleteCardholder(const void *pInformationIn);

/**
 * @brief 更新持卡人
 *
 * @param pInformationIn - 持卡人信息
 * @return uint8_t       - 更新结果
 */
extern uint8_t ProtocolUpdateCardholder(const void *pInformationIn);

/**
 * @brief 获取已注册持卡人清单
 *
 * @param pCardholderListOut - 已注册持卡人清单
 * @return uint8_t           - 已注册持卡人数量
 */
extern uint8_t ProtocolGetRegisteredCardholderList(uint8_t *pCardholderListOut);

/**
 * @brief 解析蓝牙虚拟卡
 *
 * @param pMessageIn - 蓝牙虚拟卡信息
 * @return uint8_t   - 解析状态
 */
extern uint8_t ProtocolAnalyzingBluetoothVirtualCards(const void *pMessageIn);

/**
 * @brief 获取引导程序固件校验值
 *
 * @param FileSize  - 文件大小
 * @return uint32_t - 引导程序固件校验值
 */
extern uint32_t ProtocolGetUpdateBootloaderFirmwareCrcValue(uint32_t FileSize);

/**
 * @brief 写引导程序固件数据
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool ProtocolWriteBootloaderFirmwareData(uint32_t WriteOffset, const uint8_t *pFileDataIn, uint32_t FileSize);

/**
 * @brief 启动设备自检任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool ProtocolStartDeviceSelfTestTask(void);

/**
 * @brief 获取人脸模组注册用户数量
 *
 * @return uint8_t - 注册数量
 */
extern uint8_t ProtocolGetSafetyModuleNumberOfRegisteredUsers(void);

/**
 * @brief 获取人脸模组设备序列号
 *
 * @param pSerialNumber - 设备序列号
 */
extern void ProtocolGetSafetyModuleSerialNumber(char *pSerialNumberOut);

/**
 * @brief 获取w外部验证模组固件版本号
 *
 * @param pVersionOut - 固件版本号
 */
extern void ProtocolGetSafetyModuleApplicationVersion(char *pVersionOut);

/**
 * @brief 获取w外部验证模组算法版本号
 *
 * @param pVersionOut - 算法版本号
 */
extern void ProtocolGetSafetyModuleAlgorithmVersion(char *pVersionOut);

/**
 * @brief 获取无限模组信号增益
 *
 * @return uint8_t - 信号增益
 */
extern uint8_t ProtocolGetWirelessCommunicationQuality(void);

/**
 * @brief 获取无线模组序列号
 *
 * @param pSerialNumber - 模组序列号
 */
extern void ProtocolGetWirelessModuleSerialNumber(void *pSerialNumberOut);

/**
 * @brief 获取模组固件版本号
 *
 * @param pApplicationOut - 固件版本号
 */
extern void ProtocolGetWirelessModuleApplication(void *pApplicationOut);

/**
 * @brief 获取无线模组 SIM 卡卡号
 *
 * @param pSimCardOut - SIM 卡号
 */
extern void ProtocolGetWirelessSimCardNumber(char *pSimCardOut);

/**
 * @brief 获取无线模组 SIM卡 IMSI编码
 *
 * @param pImsiOut - IMSI编码
 */
extern void ProtocolGetWirelessImsiCode(char *pImsiOut);

/**
 * @brief 提示密钥操作成功
 *
 */
extern void ProtocolRemindersKeyOperationSuccess(void);

/**
 * @brief 提示密钥操作失败
 *
 */
extern void ProtocolRemindersKeyOperationError(void);

/**
 * @brief 上报网络附着失败
 *
 */
extern void ProtocolPromptToNetworkAttachmentFailure(void);

/**
 * @brief 提示网络附着结束
 *
 */
extern void ProtocolPromptToNetworkAttachmentEnd(void);

/**
 * @brief 提示连接异常
 *
 */
extern void ProtocolRemindersConnectionAnomaly(void);

/**
 * @brief AES-ECB加密
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 待加密的数据
 */
extern void ProtocolCalculateAesEcbEncrypt(uint8_t *pKeyIn, uint8_t *pDataIn);

/**
 * @brief AES-ECB解密
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 待解密的数据
 */
extern void ProtocolCalculateAesEcbDecrypt(uint8_t *pKeyIn, uint8_t *pDataIn);

/**
 * @brief 提示命令解锁失败
 *
 */
extern void ProtocolRemindersCommandUnlockFailure(void);

/**
 * @brief 提示二维码解锁失败
 *
 */
extern void ProtocolRemindersQrcodeUnlockFailure(void);

/**
 * @brief 提示权限不足
 *
 * @param KeyType - 密钥类型
 */
extern void ProtocolRemindersInsufficientAuthority(uint8_t KeyType);

/**
 * @brief 启动重启设备任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool ProtocolStartDeviceRebootTask(void);

/**
 * @brief 启动设备恢复出厂任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool ProtocolStartDeviceFactoryResetTask(void);

/**
 * @brief 标志设备进入待机模式
 *
 */
extern void ProtocolMarkDeviceIntoStandbyMode(void);

/**
 * @brief 重置网络保活时间
 *
 */
extern void ProtocolResetNetworkKeepLiveTimer(void);

/**
 * @brief 标志日志上传完成
 *
 */
extern void ProtocolMarkLogUploadFinished(void);

/**
 * @brief 主动请求服务器任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool ProtocolStartActivelyRequestServerTask(void);

/**
 * @brief 启动网络附着任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool ProtocolStartNetworkAttachmentTask(void);

/**
 * @brief 启动特征值文件注册
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool ProtocolStartSafetyFeatureValueFileRegistration(void);

/**
 * @brief 启动本地注册密钥任务
 *
 * @param pLocalRegistrationInformationIn - 本地注册密钥信息
 * @return bool                           - 启动状态（true：成功 false：失败）
 */
extern bool ProtocolStartLocalRegisterKeyTask(const void *pLocalRegistrationInformationIn);

/**
 * @brief 读取特征值文件属性
 *
 * @param pFileSizeOut  - 文件大小
 * @param pCheckCodeOut - 校验码
 */
extern void ProtocolReadTheEigenvalueFileInformation(uint32_t *pFileSizeOut, uint8_t *pCheckCodeOut);

/**
 * @brief 写入特征值文件
 *
 * @param Offset  - 写入地址偏移
 * @param pDataIn - 写入文件
 * @param SizeIn  - 写入文件大小
 * @return bool   - 写入状态（true：成功 false：失败）
 */
extern bool ProtocolSaveTheEigenvalueFile(uint32_t Offset, const void *pDataIn, uint16_t FileSize);

/**
 * @brief 重置引导程序固件更新任务定时器
 *
 */
extern void ProtocolResetBootloaderFirmwareTaskTimer(void);

/**
 * @brief 进入引导程序固件更新
 *
 * @param FileSize - 引导程序固件大小
 * @return bool    - 进入状态（true：成功 false：失败） 
 */
extern bool ProtocolIntoBootloaderFirmwareUpdate(uint32_t FileSize);
/**
 * @brief 进入固件更新
 *
 * @param FileSize - 文件大小
 * @return bool    - 进入状态（true：成功 false：失败）
 */
extern bool ProtocolIntoFirmwareUpdate(uint32_t FileSize);

/**
 * @brief 获取日志文件数量
 *
 * @return uint16_t - 日志文件数量
 */
extern uint16_t ProtocolGetNumberOfLofFile(void);

/**
 * @brief 写入命令解锁执行结果日志
 *
 * @param pUserIdIn - 用户编码
 * @param Result    - 执行结果
 */
extern void ProtocolWriteCommandUnlockExecuteResultLog(uint8_t *pUserIdIn, bool Result);

/**
 * @brief 写二维码解锁执行结果日志
 *
 * @param pUserIdIn - 用户编码
 * @param Result    - 执行结果
 */
extern void ProtocolWriteQrUnlockExecuteResultLog(uint8_t *pUserIdIn, bool Result);

/**
 * @brief 写外部验证结果日志
 *
 * @param KeyType     - 密钥类型
 * @param pKeyValueIn - 密钥
 * @param Result      - 执行结果
 */
extern void ProtocolWriteExternalValidationResultLog(uint8_t KeyType, uint8_t *pKeyValueIn, bool Result);

/**
 * @brief 从目标序号获取特定数量的日志文件
 *
 * @param SpecificNumber  - 目标起始序号
 * @param Quantity        - 获取数量
 * @param pLogFileOut     - 日志文件信息
 * @param pLogFileSizeOut - 日志文件数据长度
 * @return uint8_t        - 获取状态
 */
extern uint8_t ProtocolGetSpecificNumberOfLogFilesFromTheTargetSerialNumber(uint16_t SpecificNumber, uint8_t Quantity, uint8_t *pLogFileOut, uint16_t *pLogFileSizeOut);

/**
 * @brief 获取缓存日志文件
 *
 * @param pLogFileOut     - 日志文件
 * @param pLogFileSizeOut - 日志文件长度
 * @param pQuantityOut    - 日志文件数量
 */
extern void ProtocolGetCecheLogFilePacket(uint8_t *pLogFileOut, uint16_t *pLogFileSizeOut, uint8_t *pQuantityOut);

/**
 * @brief 获取本地是否存在待推送日志
 *
 * @return bool - 缓存状态（true：存在 false：不存在）
 */
extern bool ProtocolGetLogFilePushStatus(void);

/**
 * @brief 更新本地日志推送状态
 *
 * @param LogId - 日志编码
 */
extern void ProtocolUpdateLogFilePushStatus(uint16_t LogId);

/**
 * @brief 分配所需的内存空间
 *
 * @param MallocSize - 内存块的大小，以字节为单位
 * @return uint8_t*  - 指向已分配大小的内存。如果请求失败，则返回 NULL
 */
extern uint8_t *ProtocolMessageMalloc(const uint16_t MallocSize);

/**
 * @brief 释放已分配的内存
 *
 * @param ptr - 指针指向一个要释放内存的内存块
 */
extern void ProtocolMessageFree(void *ptr);

/**
 * @brief 获取系统时间
 *
 * @return uint32_t - 当前系统时间
 */
extern uint32_t ProtocolMessageGetSystemClockTime(void);

/**
 * @brief  获取电梯编号
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetElevatorId(void);

/**
 * @brief  设置电梯编号
 * 
 * @param ElevatorId 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetElevatorId(uint8_t ElevatorId);

/**
 * @brief  获取电梯起始楼层
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetElevatorStartFloor(void);

/**
 * @brief  设置公共楼层数据
 * 
 * @param Data 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetPublicFloorData(uint8_t* Data);

/**
 * @brief  获取公共楼层数据
 * 
 * @param Data 
 * @return true 
 * @return false 
 */
extern bool ProtocolGetPublicFloorData(uint8_t* Data);

/**
 * @brief  获取读取卡片密钥
 * 
 * @param SectorKey 
 * @return true 
 * @return false 
 */
extern bool ProtocolGetReadCardSectorKey(uint8_t* SectorKey);

/**
 * @brief  获取读取卡片密钥
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetReadCardStartSectorId(void);

/**
 * @brief  获取电梯目标楼层
 * 
 * @param pDestinMacAddr 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetDestinMacAddress(uint8_t *pDestinMacAddr);

/**
 * @brief  设置电梯起始楼层
 * 
 * @param StartFloor 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetElevatorStartFloor(uint8_t StartFloor);

/**
 * @brief  获取文件总大小
 * 
 * @param pFileSumSize 
 * @return true 
 * @return false 
 */
extern uint32_t ProtocolGetFileSumSize(void);

/**
 * @brief 设置文件总大小
 * 
 * @param FileSumSize 
 */
extern bool ProtocolSetFileSumSize(uint32_t FileSumSize);

/**
 * @brief  设置卡片扇区密钥
 * 
 * @param SectorKey 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetReadCardSectorKey(uint8_t* SectorKey);

/**
 * @brief 获取梯控主板数量
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetEleControlBoardNumber(void);

/**
 * @brief 设置梯控主板数量
 * 
 * @param Number 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetEleControlBoardNumber(uint8_t Number);

/**
 * @brief 获取梯控开关状态
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetEleControlSwitch(void);

/**
 * @brief 设置梯控开关状态
 * 
 * @param Switch 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetEleControlSwitch(uint8_t Switch);

/**
 * @brief 获取火灾报警模式
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetFireAlarmMode(void);

/**
 * @brief 设置火灾报警模式
 * 
 * @param Mode 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetFireAlarmMode(uint8_t Mode);

/**
 * @brief 设置蓝牙主机连接Rssi
 * 
 * @param Mode 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetBleMasterConnectRssi(uint8_t Mode);

/**
 * @brief 获取蓝牙主机连接Rssi
 * 
 * @return uint8_t 
 */
extern uint8_t ProtocolGetBleMasterConnectRssi(void);

/**
 * @brief  设置卡片读取的起始扇区
 * 
 * @param SectorId 
 * @return true 
 * @return false 
 */
extern bool ProtocolSetReadCardStartSectorId(uint8_t SectorId);

/**
 * @brief 抛掷事件
 *
 * @param DataSource - 数据源
 * @param pMessageIn - 输入报文
 * @param SizeIn     - 报文数据长度
 * @return bool      - 抛掷状态（true：成功 false：失败）
 */
extern bool ProtocolThrowingEvent(uint8_t DataSource, const uint8_t *pMessageIn, const uint16_t SizeIn);

/**
 * @brief 停止报文发送任务
 *
 */
extern void ProtocolCenterStopSendingTask(void);

/**
 * @brief 延时启动报文发送认为有
 *
 * @param Ms - 延时的时间
 */
extern void ProtocolDelayedStartSendingTask(uint32_t Ms);

/**
 * @brief 立刻启动报文发送任务
 *
 */
extern void ProtocolStartSendingTaskNoWait(void);

/**
 * @brief  启动报文发送任务
 * 
 * @param Parm 
 * @return true 
 * @return false 
 */
extern bool EventElevatorIoBoradFirmwareTransferTask(IoBoardFirmwareInfo_t *Parm);

/**
 * @brief  写入io板固件文件大小
 * 
 * @param Offset 
 * @param pDataIn 
 * @param FileSize 
 * @return true 
 * @return false 
 */
extern bool ProtocolWriteIoBoardFirmwareFile(uint32_t Offset, const void *pDataIn, uint16_t FileSize);

/**
 * @brief  读取io板固件文件
 * 
 * @param Offset 
 * @param pDataOut 
 * @param FileSize 
 */
extern void ProtocolReadIoBoardFirmwareFile(uint32_t Offset, void *pDataOut, uint16_t FileSize);

/**
 * @brief 消息中心初始化
 *
 * @param pExternalInterfaces - 外部调用方法
 */
extern void ProtocolCenterInitialisation(ProtocolCenterExternalInterfaces_t *pExternalInterfaces);

#endif
